package entity

import (
	"fmt"
	"time"
)

// Connection 表示一个数据库连接
// Connection结构体用于描述数据库连接的详细信息，包括连接参数、状态及相关配置
// 便于统一管理和维护数据库连接
type Connection struct {
	ID              string    `json:"id"`                // 连接唯一标识
	Name            string    `json:"name"`              // 连接名称
	Type            string    `json:"type"`              // 数据库类型（如mysql、mariadb等）
	Host            string    `json:"host"`              // 主机地址
	Port            int       `json:"port"`              // 端口号
	Username        string    `json:"username"`          // 用户名
	Password        string    `json:"password"`          // 密码
	DatabaseName    string    `json:"database_name"`     // 数据库名称
	Description     string    `json:"description"`       // 连接描述信息
	MaxIdleConns    int       `json:"max_idle_conns"`    // 最大空闲连接数
	MaxOpenConns    int       `json:"max_open_conns"`    // 最大打开连接数
	ConnMaxLifetime int       `json:"conn_max_lifetime"` // 连接最大生命周期（秒）
	Status          string    `json:"status"`            // 连接状态（active/inactive）
	CreatedAt       time.Time `json:"created_at"`        // 创建时间
	UpdatedAt       time.Time `json:"updated_at"`        // 更新时间
}

// ConnectionStatus 连接状态
// 用于描述数据库连接的当前状态及错误信息
type ConnectionStatus struct {
	ID        string    `json:"id"`              // 连接唯一标识
	Status    string    `json:"status"`          // 当前状态
	Error     string    `json:"error,omitempty"` // 错误信息（可选）
	UpdatedAt time.Time `json:"updated_at"`      // 状态更新时间
}

// NewConnection 创建新数据库连接
func NewConnection(name, dbType, host string, port int, dbName, username, password string) *Connection {
	return &Connection{
		Name:            name,
		Type:            dbType,
		Host:            host,
		Port:            port,
		DatabaseName:    dbName,
		Username:        username,
		Password:        password,
		MaxIdleConns:    10,
		MaxOpenConns:    100,
		ConnMaxLifetime: 3600,
		Status:          "active",
	}
}

// IsActive 检查连接是否处于活动状态
func (c *Connection) IsActive() bool {
	return c.Status == "active"
}

// GetDSN 获取数据库连接字符串
func (c *Connection) GetDSN() string {
	switch c.Type {
	case "mysql":
		return c.getMySQLDSN()
	case "postgresql":
		return c.getPostgreSQLDSN()
	default:
		return ""
	}
}

// getMySQLDSN 获取MySQL连接字符串
func (c *Connection) getMySQLDSN() string {
	return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		c.Username, c.Password, c.Host, c.Port, c.DatabaseName)
}

// getPostgreSQLDSN 获取PostgreSQL连接字符串
func (c *Connection) getPostgreSQLDSN() string {
	return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
		c.Host, c.Port, c.Username, c.Password, c.DatabaseName)
}
